# asyncio是Python 3.4版本引入的标准库，用于编写单线程并发代码。它提供了事件循环、协程、任务、Future、流等组件，用于构建异步I/O程序。
# aiohttp是一个基于asyncio的异步HTTP客户端/服务器框架。它提供了异步的HTTP请求和响应处理功能，使得可以编写高性能的异步Web应用和爬虫。
# 我们先安装aiohttp：
# pip install aiohttp

# 编写一个HTTP服务器，分别处理以下URL：
#   / - 首页返回b'Index'；
#   /hello/{name} - 根据URL参数返回文本hello, %s!。
import asyncio
from aiohttp import web

def index(request):
    return web.Response(body=b'<h1>Index</h1>')

async def hello(request):
    # # 暂停0.5秒，模拟异步操作
    await asyncio.sleep(0.5)
    text = '<h1>Hello, %s</h1>' % request.match_info['name']
    return web.Response(body=text.encode('utf-8'))

# @asyncio.coroutine 是一个装饰器，用于将生成器函数转换为协程。
async def init():
    # 创建一个aiohttp应用
    app = web.Application()
    # 添加路由，定义GET请求的处理函数
    app.router.add_route('GET', '/', index)
    app.router.add_route('GET', '/hello/{name}', hello)
    # 创建AppRunner
    runner = web.AppRunner(app)
    await runner.setup()
    # 创建服务器，监听127.0.0.1的8080端口
    site = web.TCPSite(runner, '127.0.0.1', 8080)
    await site.start()
    print('Server started at http://127.0.0.1:8000...')

# 获取事件循环
loop = asyncio.get_event_loop()
# 运行初始化函数，启动服务器
loop.run_until_complete(init())
# 运行事件循环，保持服务器运行
loop.run_forever()
# 注意aiohttp的初始化函数init()也是一个coroutine，loop.create_server()则利用asyncio创建TCP服务。

# 从 Python 3.5 开始，推荐使用 async def 语法定义协程，因为这种方式更加简洁和直观。以下是两种定义方式的对比：
# 1.使用 @asyncio.coroutine：
#   @asyncio.coroutine
#   def my_coroutine():
#       yield from asyncio.sleep(1)
# 2.使用 async def：
#   async def my_coroutine():
#       await asyncio.sleep(1)